﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using bi4homev3;
using System.Security.Cryptography;
using System.Data.OracleClient;
using System.Text;

namespace bi4homev3.Acceso_a_Datos
{
    //Clase especifica e Oracle para las operaciones de Usuario
    public class OracleUsuarioDAO : UsuarioDAO
    {
        public OracleUsuarioDAO()
        {

        }
        //Metodo para validar el login de un usuario
        public int ValidarUsuario1(Usuario user)
        {
            #region cuerpo del metodo, CReacion de DAOs fijacion de parametros y ejecucion del Proc de BD
            //entero que guardara el resultado del metodo de validacion con bd
            int resultado = 0;
            //Creacion de conexion 
            OracleConnection comando = FabricaOracleDAO.Crear(); 
            //Cifrado de clave, la clave nunca pasa en claro cuando se pasa ala bd
            //para su validacion, en el momento de la creacion se cifra en MD5
            //y se guarda el claro cifrado, para comparar se cifra en la aplicacion
            //y se comparan los textos cifrados
            user.Clave = this.cifrado1(user.Clave);
            OracleCommand comando1 = new OracleCommand("APLICACION.VALIDAR_CLAVE_USUARIO", comando);
            comando1.CommandType = CommandType.StoredProcedure;
            comando1.Parameters.Add(new OracleParameter("login", OracleType.VarChar, 15));
            comando1.Parameters.Add(new OracleParameter("psswd", OracleType.VarChar, 20));
            comando1.Parameters["login"].Value = user.Login;
            comando1.Parameters["psswd"].Value = user.Clave;
            comando1.Parameters.Add(new OracleParameter("checkval", OracleType.Number, 1));
            comando1.Parameters["checkval"].Direction = ParameterDirection.ReturnValue;
            comando1.ExecuteScalar();
            resultado = Convert.ToInt32(comando1.Parameters["checkval"].Value);
            #endregion
            FabricaOracleDAO.cerrarConexion();

            return resultado;
        }

        public string cifrado1(string clave)
        {
            Byte[] originalBytes;
            Byte[] encodedBytes;
            MD5 md5;
            string salida;

            #region Cifrado de bytes de clave en claro y conversion a Bytes leibles
            //Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash (encoded password)
            md5 = new MD5CryptoServiceProvider();
            originalBytes = ASCIIEncoding.Default.GetBytes(clave);
            encodedBytes = md5.ComputeHash(originalBytes);

            //Convert encoded bytes back to a 'readable' string
            salida = BitConverter.ToString(encodedBytes);
            #endregion
            return salida;
        }


        public void InsertarUsuario1(Usuario user)
        {
            #region Metodo de insercion de usuario
            OracleConnection conexion = FabricaOracleDAO.Crear();
            OracleCommand comando = new OracleCommand("APLICACION.INSERTAR_USUARIO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("login", OracleType.VarChar, 15));
            comando.Parameters.Add(new OracleParameter("psswd", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("nombre", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("apellido", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("correo", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("carga", OracleType.Number, 2));
            comando.Parameters.Add(new OracleParameter("ingreso", OracleType.Float, 10));
            comando.Parameters["login"].Value = user.Login;
            comando.Parameters["psswd"].Value = cifrado1(user.Clave);
            comando.Parameters["nombre"].Value = user.Nombre;
            comando.Parameters["apellido"].Value = user.Apellido;
            comando.Parameters["carga"].Value = user.Carga;
            comando.Parameters["ingreso"].Value = user.Ingreso;
            comando.Parameters["correo"].Value = user.Correo;
            comando.ExecuteScalar();
            #endregion
            FabricaOracleDAO.cerrarConexion();
        }

        public void CambioClave(Usuario user)
        {
            #region cuerpo de metodo para cambiar la clave
            OracleConnection conexion = FabricaOracleDAO.Crear();
            OracleCommand comando = new OracleCommand("APLICACION.MODIFICARCLAVE", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("usua", OracleType.VarChar, 15));
            comando.Parameters.Add(new OracleParameter("clave", OracleType.VarChar, 20));
            comando.Parameters["usua"].Value = user.Login;
            comando.Parameters["clave"].Value = cifrado1(user.Clave);
            comando.ExecuteScalar();
            #endregion
            FabricaOracleDAO.cerrarConexion();
        }
        
        public void CambioPerfil (Usuario user)
        {
            #region Cambio de datos de perfil
            OracleConnection conexion = FabricaOracleDAO.Crear();
            OracleCommand comando = new OracleCommand("APLICACION.MODIFICARPERFIL", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("usua", OracleType.VarChar, 15));
            comando.Parameters.Add(new OracleParameter("montonuevo", OracleType.Number, 20));
            comando.Parameters.Add(new OracleParameter("cargaf", OracleType.Number, 2));
            comando.Parameters["usua"].Value = user.Login;
            comando.Parameters["montonuevo"].Value = user.Ingreso;
            comando.Parameters["cargaf"].Value = user.Carga;
            comando.ExecuteScalar();
            #endregion
            FabricaOracleDAO.cerrarConexion();
        }
    }
}
